package cn.huixh.blindbox.utils;

import cn.huixh.blindbox.exception.impl.BizException;
import cn.hutool.core.util.ArrayUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;


/**
 * @author huixh
 * @version 1.0
 * @date 2022/5/13 13:47
 */
@Component
public class JoinPointUtil {

    @SuppressWarnings("unchecked")
    public < T > T getParamByName(JoinPoint joinPoint, String paramName, Class< T > clazz) {
        // 获取所有参数的值
        Object[] args = joinPoint.getArgs();
        // 获取方法签名
        Signature signature = joinPoint.getSignature();
        MethodSignature methodSignature = (MethodSignature) signature;
        // 在方法签名中获取所有参数的名称
        String[] parameterNames = methodSignature.getParameterNames();
        // 根据参数名称拿到下标， 参数值的数组和参数名称的数组下标是一一对应的
        int index = ArrayUtil.indexOf(parameterNames, paramName);
        // 在参数数组中取出下标对应参数值
        Object obj;
        try {
            obj = args[ index ];
        } catch ( ArrayIndexOutOfBoundsException e ) {
            throw new BizException("token 不存在");
        }
        if (obj == null) {
            return null;
        }
        // 将object对象转为Class返回
        if (clazz.isInstance(obj)) {
            return clazz.cast(obj);
        }
        return (T) obj;
    }

}
